class WxRequest {
  defaults = {
    baseURL: '', // 请求基准地址
    url: '', // 开发者服务器接口地址
    data: null, // 请求参数
    method: 'GET',// 默认请求方法
    // 请求头
    header: {
      'Content-type': 'application/json' // 设置数据的交互格式
    },
    timeout: 60000 // 小程序默认超时时间是 60000，一分钟
  }
  interceptors = {
    request: (config) => config,
    response: (response) => response
  }
  // 定义 constructor 构造函数，用于创建和初始化类的属性和方法
  constructor(params = {}) {
    // 在实例化时传入的参数能够被 constructor 进行接收
    console.log(params)
    // 使用 Object.assign 合并默认参数以及传递的请求参数
    this.defaults = Object.assign({}, this.defaults, params)
  }
  /**
   * @description 发起请求的方法
   * @param { Object} options 请求配置选项，同 wx.request 请求配置选项
   * @returns Promise
   */
  request(options) {
    options.url = this.defaults.baseURL + options.url
    options = { ...this.defaults, ...options }
    // console.log(options);
    // 在发送请求之前调用请求拦截器
    options = this.interceptors.request(options)
    // 使用 Promise 封装异步请求
    return new Promise((resolve, reject) => {
      // 使用 wx.request 发起请求
      wx.request({
        ...options,

        // 接口调用成功的回调函数
        success: (res) => {
          // 不管接口成功还是失败，都需要调用响应拦截器
          // 第一个参数：需要合并的目标对象
          // 第二个参数：服务器响应的数据
          // 第三个参数：请求配置以及自定义的属性
          const mergetRes = Object.assign({}, res, { config: options, isSuccess: true })
          resolve(this.interceptors.response(mergetRes))
          resolve(res)
        },
        // 接口调用失败的回调函数
        fail: (err) => {
          // 不管接口成功还是失败，都需要调用响应拦截器
          const mergetErr = Object.assign({}, err, { config: options, isSuccess: false })
          reject(this.interceptors.response(mergetErr))
          reject(err)
        }
      })
    })
  }
  get(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: 'GET' }, config))
  }
  // 封装 POST 实例方法
  post(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: 'POST' }, config))
  }

  // 封装 PUT 实例方法
  put(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: 'PUT' }, config))
  }

  // 封装 DELETE 实例方法
  delete(url, data = {}, config = {}) {
    return this.request(Object.assign({ url, data, method: 'DELETE' }, config))
  }
  //用来处理并发请求
  all(...promise) {
    // console.log(promise);
    return Promise.all(promise)
  }
}
export default WxRequest